<?php
/**
 * Created by PhpStorm.
 * User: lhl
 * Date: 2019/5/30
 * Time: 18:17
 * Features: 字符串相关方法封装
 */

namespace app\common\service;


use think\facade\Config;

class StringHelper
{
    /**
     * 生成随机字符串
     * @param int $length 字符串长度
     * @return string
    */
    public static function getRandString($length = 32){
        $sourceStr = '012345679abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $str = '';
        for($i = 0 ;$i < $length ;$i++){
            $str .= $sourceStr[mt_rand(0,strlen($sourceStr) - 1)];
        }
        return $str;
    }

    /**
     * 创建订单号
     * @param string $prefix 订单号前缀
     * @return string
     */
    public static function orderNo($prefix = ''){
        $yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
        $orderSn = $prefix.$yCode[intval(date('Y')) - 2017] . date('Y').strtoupper(dechex(date('m'))) . date('d') . substr(time(), -5) . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99));
        return $orderSn;
    }

    /**
     * 生成唯一md5码
    */
    public static function uniqueMd5(){
        $no = self::orderNo();
        return md5($no);
    }

    /**
     * 将html实体转换为html标签
     * @param string $str 实体字符内容
     * @return string
     */
    public static function htmlDecode($str){
        $filter = Config::get('app.default_filter');
        switch ($filter){
            case 'htmlentities':
                $str = html_entity_decode($str);
                break;
            case 'htmlspecialchars':
                $str = htmlspecialchars_decode($str);
                break;
        }
        return $str;
    }

    /**
     * 下划线+小写转换为驼峰
     * @param string $str 小写+下划线字符串
    */
    public static function convertUnderline($str)
    {
        $str = preg_replace_callback('/([-_]+([a-z]{1}))/i',function($matches){
            return strtoupper($matches[2]);
        },$str);
        return $str;
    }

    /*
     * 驼峰转换为小写+下划线
     * @param string $str 驼峰字符串
     */
    public static function humpToLine($str){
        $str = preg_replace_callback('/([A-Z]{1})/',function($matches){
            return '_'.strtolower($matches[0]);
        },$str);
        return $str;
    }

    /*
     * 去除url中的queryString
     * @param string $url url连接
     */
    public  static function removeQueryStringFromUrl($url) {
        if (substr($url,0,4) =="http") {
            $urlPartsArray = parse_url($url);
            $outputUrl = $urlPartsArray['scheme']. '://'. $urlPartsArray['host']. ( isset($urlPartsArray['path'])? $urlPartsArray['path'] : '' );
        }
        else {
            $URLexploded = explode("?", $url, 2);
            $outputUrl = $URLexploded[0];
        }
        return $outputUrl;
    }

   /*
    * 版本号比较
    * @param string $versionA 版本A 如:5.3.2
    * @param string $versionB 版本B 如:5.3.0
    *
    * @return int -1版本A小于版本B , 0版本A等于版本B, 1版本A大于版本B
    *
    * 版本号格式注意：
    *       1.要求只包含:点和大于等于0小于等于2147483646的整数的组合
    *       2.boole型 true置1，false置0
    *       3.不设位默认补0计算，如：版本号5等于版号5.0.0
    *       4.不包括数字或负数的版本号 ,统一按0处理
    *
    *    @example:
    *       if (self::versionCompare('5.2.2','5.3.0')<0) {
    *            echo '版本1小于版本2';
    *       }
    */
    public static function versionCompare($versionA,$versionB)
    {
        if ($versionA > 2147483646 || $versionB > 2147483646) {
            throw new \Exception('版本号位数太大暂不支持!', '101');
        }
        $dm = '.';
        $verListA = explode($dm, (string)$versionA);
        $verListB = explode($dm, (string)$versionB);

        $len = max(count($verListA), count($verListB));
        $i = -1;
        while ($i++ < $len) {
            $verListA[$i] = intval(@$verListA[$i]);
            if ($verListA[$i] < 0) {
                $verListA[$i] = 0;
            }
            $verListB[$i] = intval(@$verListB[$i]);
            if ($verListB[$i] < 0) {
                $verListB[$i] = 0;
            }

            if ($verListA[$i] > $verListB[$i]) {
                return 1;
            } else if ($verListA[$i] < $verListB[$i]) {
                return -1;
            } else if ($i == ($len - 1)) {
                return 0;
            }
        }
    }

}